package helpers;

import java.awt.Component;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

// Manager class που χρησιμοποιείται για τον έλεγχο εγκυρότητας των entities
public class ValidationHelper {
    private final DateFormat df = new SimpleDateFormat("dd/MM/yyyy");
    private List<ValidationRule> rules;
    
    // Κανόνας Εγκυρότητας
    public class ValidationRule {
        private boolean invalidCondition;
        private String message;
        
        public void setInvalidCondition(boolean _condition) {
            invalidCondition = _condition;
        }
        
        public boolean getInvalidCondition() {
            return invalidCondition;
        }
        
        public void setMessage(String _message){
            message = _message;
        }
        public String getMessage() {
            return message;
        }
        
        public boolean isValid() {
            return !invalidCondition;
        }
        
        public ValidationRule(){
        }
    
        public ValidationRule(boolean _condition, String _message){
            invalidCondition = _condition;
            message = _message;
        }
    }
    
    // Λίστα με τους Κανόνες Εγκυρότητας
    public List<ValidationRule> getRules() {
        return rules;
    }
    
    // Επιστρέφει τον Date Formatter που χρησιμοποιεί η εφαρμογή
    public DateFormat getDF(){
        return df;
    }
    
    public Date parseDate(String dateString){
        try {
            return df.parse(dateString);
        }
        catch (ParseException ex) {
            return null;
        }
    }
    
    public ValidationHelper()
    {
        rules = new ArrayList<>();
    }
    
    // Προσθήκη ενός νέου κανόνα στους κανόνες εγκυρότητας του instance
    // του ValidationHelper
    public void addRule(boolean _invalidCondition, String _message) {
        this.getRules().add(new ValidationRule(_invalidCondition, _message));
    }
    
    // Προσθήκη ενός νέου κανόνα εγκυρότητας ημερομηνίας
    public void addDateRule(String _dateString, String _message) {
        this.addRule(!isValidDate(_dateString), _message);
    }
    // Προσθήκη ενός νέου κανόνα εγκυρότητας ημερομηνίας με το default μήνυμα
    // σφάλματος
    public void addDateRule(String _dateString) {
        this.addDateRule(_dateString, "Η Ημερομηνία πρέπει να είναι στη μορφή 'dd/MM/yyyy' !");
    }
    // Έλεγχος αν ένα string είναι σε σωστή μορφή ημ/νίας
    public boolean isValidDate(String dateString) {
        return parseDate(dateString) != null;
    }
    
    // Έλεγχος για διπλότυπα σε λίστα από αντικείμενα
    public boolean hasDuplicates(List<Class<?>> items){
        Set<Class<?>> set = new HashSet<>(items);
        return set.size() < items.size(); // true = έχει διπλότυπα
    }
    
    // Εμφάνιση μηνύματος μη έγκυρων δεδομένων
    public static void showValidationError(Component c, String message) {
        UIHelper.showWarning(c, "Μη Έγκυρα Δεδομένα", message);
    }
    
    // Επιστρέφει true αν όλοι οι κανόνες επιστρέψουν isValid() = true
    // αλλιώς επιστρέφει false και δείχνει στο χρήστη όλα τα μηνύματα
    // μη έγκυρων δεδομένων
    // (χρήση του internal rule collection του ValidationHelper)
    public boolean validateRules(Component c){
        return ValidationHelper.validateRules(c, getRules());
    }
    
    // Επιστρέφει true αν όλοι οι κανόνες επιστρέψουν isValid() = true
    // αλλιώς επιστρέφει false και δείχνει στο χρήστη όλα τα μηνύματα
    // μη έγκυρων δεδομένων
    public static boolean validateRules(Component c, List<ValidationRule> rules){
        boolean isValid = true;
        String errorMessage = "";
        
        for(ValidationRule rule : rules){
            if (!rule.isValid()) {
                isValid = false;
                errorMessage += rule.getMessage() + "\n";
            }
        }
        if (!isValid){
            ValidationHelper.showValidationError(c, errorMessage);
        }
        
        return isValid;
    }
}
